Scenario

Flyweight
플라이웨이트 패턴은 많은 수의 가벼운 임시 객체들을 스마트 참조로 사용하는 것을 말한다.
대단히 많은 수의 매우 비슷한 객체들이 사용되어야 할 때, 메모리 사용량을 절감하기 위해 사용하는 방법이다.
Scenario
동일한 값을 가지는 데이터를 중복으로 메모리를 가지는 대신 포인터로 이를 대체한다.
(64비트 머신 기준, 포인터는 8바이트의 메모리를 차지)
포인터가 사용하는 공간도 적지 않기 때문에, 배열을 사용해서 더욱 공간을 절감할 수도 있다.
typedef uint32_t key; // key
struct User{
User(const string& first_name, const string& last_name): first_name{add(first_name)}, last_name{add(last_name)} {}
// ...
protected:
key first_name, last_name;
static bimap<key, string> names;
static key seed;
static key add(const string& s){
auto it-names.right.find(s);
if(it==names.right.end()){
// ,
names.insert({++seed, s});
return seed;
}
return it->second;
}
};
// get/set
const string& get_first_name() const {
return names.left.find(first_name)->second;
}
const string& get_last_name() const {
return names.left.find(last_name)->second;
}
friend ostream& operator<<(ostream& os, count User& obj){
return os<<"first_name: "<<obj.get_first_name()<<" last_name: "<<obj.get_last_name();
}